package com.evancharlton.mileage.util;

import android.content.Context;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;

public final class Debugger {
	public static final boolean DEBUG = false;

	private static final int DEBUG_NONE = 0;
	private static final int DEBUG_QUIET = 1;
	private static final int DEBUG_WARN = 2;
	private static final int DEBUG_YELL = 3;
	private static final int DEBUG_LEVEL = DEBUG_NONE;

	private static final String TAG = "Debugger";

	public static final boolean isOnUiThread() {
		return DEBUG && Looper.getMainLooper() == Looper.myLooper();
	}

	public static final void checkQueryOnUiThread(Context context) {
		ensureNotUiThread(context, "Query on UI thread!");
	}

	public static final void ensureNotUiThread(Context context, String msg) {
		if (isOnUiThread()) {
			yell(context, msg);
		}
	}

	public static final void ensureOnUiThread(Context context, String msg) {
		if (!isOnUiThread()) {
			yell(context, msg);
		}
	}

	private static final void yell(Context context, String msg) {
		switch (DEBUG_LEVEL) {
			case DEBUG_YELL:
				throw new IllegalStateException(msg);
			case DEBUG_WARN:
				Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
			case DEBUG_QUIET:
				Log.d(TAG, msg + getStackTrace());
		}
	}

	private static final String getStackTrace() {
		final StackTraceElement[] elements = Thread.currentThread().getStackTrace();
		final int count = elements.length;
		StringBuilder sb = new StringBuilder();
		for (int i = 3; i < count; i++) {
			sb.append("\n    ").append(elements[i].toString());
		}
		return sb.toString();
	}

	public static final void d(String tag, String msg) {
		if (DEBUG || Log.isLoggable(tag, Log.DEBUG)) {
			Log.d(tag, msg);
		}
	}
}
